package ongd.web;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import ongd.negocio.gestion.ControladorVoluntario;
import ongd.negocio.gestion.Persona;
import ongd.servicios.persistencia.exceptions.IllegalOrphanException;
import ongd.servicios.persistencia.exceptions.NonexistentEntityException;
import org.primefaces.context.RequestContext;

/**
 * Clase que se encargará de listar los voluntarios activos.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
@ManagedBean
@ViewScoped
public class Listado_Voluntario extends ABean {

    /**
     * Objeto de tipo List que contiene todo los voluntarios que hay en la 
     * base de datos.
     */
    private List<Persona> voluntarios;
    /**
     * Objeto de tipo Persona que contiene el voluntario seleccionado.
     */
    private Persona voluntario;
    /**
     * Booleano que en función de su valor permitirá editar o no un voluntario.
     */
    private boolean editar;
    /**
     * Objeto de tipo ControladorVoluntario que nos servirá para realizar 
     * las operaciones referentes a los padrinos.
     */
    private ControladorVoluntario contVolun;
    /**
     * Objeto de tipo String que va a contener el título de la página donde
     * estemos.
     */
    private String titulo;

    /**
     * Contructor de la clase.
     */
    public Listado_Voluntario() {
        SesionBean sesion = getSesionBean();
        if (sesion.iniciadaSesion()) {
            titulo = "Gestionar - Voluntario";
            voluntarios = new ArrayList<Persona>();
            voluntario = new Persona();
            contVolun = sesion.getControladorVoluntario();
            voluntarios = contVolun.obtenerVoluntariosActivos();
            voluntario.setTipo("V");
        }
    }

    /**
     * Método que carga los valores iniciales tras abrir un xhtml correspondiente.
     */
    @Override
    public void cargaInicial() {
    }

    /**
     * Método que pone la variable editar a true para permitir editar un
     * voluntario.
     * @return null
     */
    public String editar() {
        editar = true;
        return null;
    }

    /**
     * Método que pone la variable editar a false para no permitir editar
     * un voluntario.
     * @return null
     */
    public String consultar() {
        editar = false;
        return null;
    }

    /**
     * Método que editará un voluntario o no, en función de la variable editar.
     * @return null
     */
    public String aceptar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (editar) {
                    if (voluntario.getNombre().compareTo("") != 0 && voluntario.getApellidos().compareTo("") != 0) {
                        if (contVolun.editarVoluntario(voluntario)) {
                            requestContext.addCallbackParam("voluntarioOK", true);
                            requestContext.addPartialUpdateTarget("form:panel");
                        } else {
                            requestContext.addCallbackParam("noModificado", true);
                        }
                    } else {
                        requestContext.addCallbackParam("faltanDatos", true);
                    }
                } else {
                    requestContext.addCallbackParam("contultar", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que borrará un voluntario.
     * @return null
     */
    public String borrar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (contVolun.borrarVoluntario(voluntario)) {
                    requestContext.addCallbackParam("borrarOK", true);
                    voluntarios = contVolun.obtenerVoluntariosActivos();
                } else {
                    requestContext.addCallbackParam("noBorrado", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que desactiva un voluntario.
     * @return null
     */
    public String desactivar() {
        if (getSesionBean().iniciadaSesion()) {
            RequestContext requestContext = RequestContext.getCurrentInstance();
            try {
                if (contVolun.desactivarVoluntario(voluntario)) {
                    requestContext.addCallbackParam("desactivadoOK", true);
                    voluntarios = contVolun.obtenerVoluntariosActivos();
                } else {
                    requestContext.addCallbackParam("noDesactivado", true);
                }
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(Listado_Voluntario.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Método que devuelve el valor de la variable contVolun.
     * @return contVolun Nuevo Valor de la variable
     * @see #setContVolun
     */
    public ControladorVoluntario getContVolun() {
        return contVolun;
    }

    /**
     * Método que establece el valor de la variable contVolun.
     * @param contVolun Nuevo Valor de la variable
     * @see #getContVolun
     */
    public void setContVolun(ControladorVoluntario contVolun) {
        this.contVolun = contVolun;
    }

    /**
     * Metodo que devuelve el valor de la variable editar.
     * @return editar
     */
    public boolean isEditar() {
        return editar;
    }

    /**
     * Método que establece el valor de la variabla editar.
     * @param editar Nuevo Valor de la variable
     */
    public void setEditar(boolean editar) {
        this.editar = editar;
    }

    /**
     * Método que devuelve el valor de la variable voluntario.
     * @return voluntario
     * @see #setVoluntario
     */
    public Persona getVoluntario() {
        return voluntario;
    }

    /**
     * Método que establece el valor de la variable voluntario.
     * @param voluntario Nuevo Valor de la variable
     * @see #getVoluntario
     */
    public void setVoluntario(Persona voluntario) {
        this.voluntario = voluntario;
    }

    /**
     * Método que devuelve el valor de la variable voluntarios.
     * @return voluntarios
     * @see #setVoluntarios
     */
    public List<Persona> getVoluntarios() {
        return voluntarios;
    }

    /**
     * Método que establece el valor de la variable voluntarios.
     * @param voluntarios Nuevo Valor de la variable
     * @see #getVoluntarios
     */
    public void setVoluntarios(List<Persona> voluntarios) {
        this.voluntarios = voluntarios;
    }

    /**
     * Método que devuelve el valor de la variable titulo.
     * @return titulo
     * @see #setTitulo
     */
    public String getTitulo() {
        return titulo;
    }

    /**
     * Método que establece el valor de la variable título.
     * @param titulo Nuevo valor de la variable
     * @see #getTitulo
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }
}